<?php

namespace App\Http\Controllers\Index;

use App\Http\Requests\UserRequest;
use App\Mail\RegMail;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Auth;
use Mail;
class UserController extends Controller
{
    public function __construct()
    {
        //判断当前用户是否登录,如果登录了,就放行继续往下,如果没登录,就返回
        //需要注意的是,如果使用系统的验证是否登录中间件,需要使用默认提供的模型和表
        //如果当前控制器中的某些方法不要受这个中间件的约束,可以给middleware方法传递第二个参数,排除一些方法名称
//        except是定义除了哪些方法之外都受约束
        $this->middleware('auth',[
            'except' => ['create','store','index','confirmEmail'],
        ]);

    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //获取所有用户信息,由于用户数据可能很多,一页展示太长了,可以使用laravel框架提供的分页方法
        $users = User::paginate(10);
        //加载用户列表模板
        return view('index.user.index',compact('users'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {

        //加载注册模板
        return view('index.user.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request,UserRequest $userRequest)
    {
        //只要能进入到该方法内,就代表表单项填写是OK的,直接将post数据存入user表中就可以了
        //接收post数据
        $post = $request->all();
        $post['password'] = bcrypt($post['password']);
        $post['email_token']=str_random(10);
        $user=User::create($post);
        //如果用户注册成功,应该给当前注册的用户填写的邮箱发送一个邮件
        //将注册成功后用户的emai_token值发送给RegMail类
        Mail::to($user)->send(new RegMail($user['email_token']));
        //设置闪存信息并返回
        session()->flash('success','注册成功,邮件已发送到您的邮箱，请去激活账号');
        return redirect()->route('home');
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\User  $user
     * @return \Illuminate\Http\Response
     */
    public function show(User $user)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\User  $user
     * @return \Illuminate\Http\Response
     */
    public function edit(User $user)
    {
        //调用警察局的编辑方法权限判断是否可以修改别人的资料
//        $this->authorize('update',$user);
        //加载编辑资料模板
        return view('index.user.edit',compact('user'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\User  $user
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, User $user)
    {
        //验证post数据
        //用户修改资料的时候,可以允许修改或者不修改密码,如果修改密码,就必须满足我要求的最小6位,最大20位的要求,如果不修改,可以允许不填,也就是为null值
        //nullable验证规则,可以允许某个字段为null值,如果为null的时候,后面再有的验证规则,就不去验证了,如果不为null的时候,后面的验证才会去验证
        $data = $request->validate([
            'username' => 'required|min:3|max:15',
            'password' => 'nullable|min:6|max:20|confirmed'
        ]);
        //修改用户数据
        $user->username = $data['username'];
        //判断当用户填写了新密码的时候,才修改密码
        if ($data['password']){
            $user->password = bcrypt($data['password']);
        }
        $user->save();
        //如果你希望验证用户修改密码是否记得,可以让用户退出登录一下
        if ($data['password']){
            Auth::logout();
            session()->flash('success','密码修改成功,请重新登录');
            return redirect()->route('home');
        }
        //设置闪存并返回
        session()->flash('success','修改成功');
        return redirect()->route('home');

    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\User  $user
     * @return \Illuminate\Http\Response
     */
    public function destroy(User $user)
    {
        //删除之前,先调用警察局的权限来判断是否允许删除,如果返回真,代表可以删除,如果返回假,就会报错,不能删除
        $this->authorize('delete',$user);
        $user->delete();
        //设置闪存并返回
        session()->flash('success','删除成功');
        return redirect()->route('user.index');
    }


    public function confirmEmail($token){
        //需要找到是哪个用户需要确认邮件,修改状态
        //通过token的值可以去user表中找到激活邮件的用户
//        where方法传递参数:
//        第一个参数是要找的满足条件的字段名
//        第二个参数是条件,例如:是 = > < like !=
//        第三个参数是对应的值
        //当你非常确定where条件只会找出一条数据的时候,可以不用get获取二维数组,可以使用first()方法取出一条数据并且是一个一维数组
        $user=User::where('email_token','=',$token)->first();
        $user->status=1;
        $user->save();
        //如果你希望邮件激活成功后帮助用户自动登录,可以使用Auth类里面的login方法
        Auth::login($user);
        //设置闪存信息,并跳转去首页
        session()->flash('success','邮件激活成功');
        return redirect()->route('home');
    }


}
